#ifndef __JSNIX_H
#define __JSNIX_H

#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <sys/select.h>
#include <sys/epoll.h>
#include <sys/sysinfo.h>
#include <sys/sendfile.h>
#include <termios.h>

#include <time.h>


#include "duktape.h"


/* testing */
#define __start_global_object(ctx, name) \
        duk_push_global_object(ctx); \
        duk_push_string(ctx, name); \
        duk_push_object(ctx);

#define __register_function(ctx, name, fn, args) \
        duk_push_string(ctx, name); \
        duk_push_c_function(ctx, fn, args); \
        duk_put_prop(ctx, -3);

#define __VARARGS DUK_VARARGS

#define __end_object(ctx) \
	duk_put_prop(ctx, -3); \
	duk_pop(ctx);


#define __put_int_prop(ctx, objid, name, val)	\
	duk_push_int(ctx, val); duk_put_prop_string(ctx, objid, name);

#define __put_number_prop(ctx, objid, name, val)	\
	duk_push_number(ctx, val); duk_put_prop_string(ctx, objid, name);

#define __put_string_prop(ctx, objid, name, val)	\
	duk_push_string(ctx, val); duk_put_prop_string(ctx, objid, name);

#define __put_lstring_prop(ctx, objid, name, val, vlen)	\
	duk_push_lstring(ctx, val, vlen); duk_put_prop_string(ctx, objid, name);

#define __put_prop_name(ctx, objid, name) \
	duk_put_prop_string(ctx, objid, name)

#define __start_object(ctx)  duk_push_object(ctx)

#define __put_new_array(ctx)  duk_push_array(ctx)

#define __put_prop_index(ctx, arrid, index) \
	duk_put_prop_index(ctx, arrid, index)
#define __count(ctx) 	duk_get_top(ctx)


#define __get_int_value(ctx, id)	duk_get_int(ctx, id)
#define __get_number_value(ctx, id)	duk_get_number(ctx, id)
#define __get_string_value(ctx, id) duk_get_string(ctx, id)
#define __get_uint32_value(ctx, id) duk_get_uint32(ctx, id)
#define __put_int_value(ctx, val) duk_push_int(ctx, val)
#define __put_number_value(ctx, val) duk_push_number(ctx, val)
#define __put_string_value(ctx, val) duk_push_string(ctx, val)


#define __get_int_prop(ctx, name, value) \
      duk_get_prop_string(ctx, -1, name); \
      value = duk_to_int(ctx, -1); duk_pop(ctx);

#define __get_string_prop(ctx, name, value) \
      duk_get_prop_string(ctx, -1, name); \
      value = duk_to_string(ctx, -1); duk_pop(ctx);

#define __get_buffer_prop(ctx, name, value, size) \
      duk_get_prop_string(ctx, -1, name); \
      value = duk_get_buffer(ctx, -1, &size); duk_pop(ctx);

#define __get_pointer_prop(ctx, name, value) \
      duk_get_prop_string(ctx, -1, name); \
      value = duk_get_pointer(ctx, -1); duk_pop(ctx);

#define JSCTX	duk_context


#define MAX_JS_POLLFDS     32
#define MAX_JS_POLL_EVENTS 32

#define ASYNC_MQFILE	"/ajsmq"

#endif
